package mailx

import (
	"fmt"
	"io"
	"os"
)

// Attachment 附件结构
type Attachment struct {
	Name string
	Body
}

// AttachmentList 附件集合
type AttachmentList []*Attachment

// Add 增加附件
func (list *AttachmentList) Add(name string, body Body) {
	*list = append(*list, &Attachment{name, body})
}

// BodyFromFile 从本地文件构造附件
func BodyFromFile(fn string) Body {
	return func(w io.Writer) (err error) {
		var f *os.File
		if f, err = os.Open(fn); err != nil {
			err = fmt.Errorf("%w", err)
			return
		}
		defer f.Close()

		if _, err = io.Copy(w, f); err != nil {
			err = fmt.Errorf("%w", err)
		}
		return
	}
}

//// BodyFromUrl 通过url(http)链接下载并构造附件
//func BodyFromUrl(url string) Body {
//	var exist bool
//	var key string
//
//	if cache != nil {
//		hash := md5.New()
//		hash.Write([]byte(url))
//		key = hex.EncodeToString(hash.Sum(nil))
//		exist, _ = cache.Exist(key)
//	}
//
//	if exist {
//		return func(w io.Writer) (err error) {
//			var fr io.ReadCloser
//			if fr, err = cache.OpenRead(key); err != nil {
//				err = fmt.Errorf("%w", err)
//				return
//			}
//
//			if _, err = io.Copy(w, fr); err != nil {
//				err = fmt.Errorf("%w", err)
//				return
//			}
//
//			return
//		}
//	}
//
//	return func(w io.Writer) (err error) {
//		var resp *http.Response
//		if resp, err = http.Get(url); err != nil {
//			return
//		}
//		defer resp.Body.Close()
//
//		if cache != nil {
//			var cw io.WriteCloser
//			if cw, err = cache.OpenWrite(key); err != nil {
//				err = fmt.Errorf("%w", err)
//			}
//			w = io.MultiWriter(w, cw)
//		}
//
//		if _, err = io.Copy(w, resp.Body); err != nil {
//			err = fmt.Errorf("%w", err)
//		}
//
//		return
//	}
//}
//
//// SetUrlCacheStore 实现Url缓存
//func SetUrlCacheStore(cacheStore UrlCacheStore) {
//	cache = cacheStore
//}
//
//var cache UrlCacheStore
//
//// UrlCacheStore Url下载缓存
//type UrlCacheStore interface {
//	// Exist 是否存在
//	Exist(key string) (bool, error)
//	// OpenRead 打开读
//	OpenRead(key string) (io.ReadCloser, error)
//	// OpenWrite 打开写
//	OpenWrite(key string) (io.WriteCloser, error)
//}
